package com.louis.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.louis.domain.DomainObject;

import org.springframework.dao.DataAccessException;

public interface GeneralDao {

	/**
	 * 保存或者更新一个domainObject
	 * 
	 * @param domainObject
	 *            对象
	 * @throws DataAccessException
	 */
	<T extends DomainObject> void saveOrUpdate(T domainObject) throws DataAccessException;

	/**
	 * 保存或者更新一组domainObject
	 * 
	 * @param domainObjects
	 *            对象集合
	 * @throws DataAccessException
	 */
	void saveOrUpdate(List<? extends DomainObject> domainObjects) throws DataAccessException;

	/**
	 * 删除一个domainObject
	 * 
	 * @param domainObject
	 *            对象
	 * @throws DataAccessException
	 */
	<T extends DomainObject> void delete(T domainObject) throws DataAccessException;

	/**
	 * 删除一组domainObject
	 * 
	 * @param domainObjects
	 *            对象集合
	 * @throws DataAccessException
	 */
	void delete(List<? extends DomainObject> domainObjects) throws DataAccessException;

	/**
	 * 根据主键删除一个domainObject
	 * 
	 * @param clazz
	 *            对象的类型
	 * @param id
	 *            主键
	 * @throws DataAccessException
	 */
	void delete(Class<? extends DomainObject> clazz, Serializable id) throws DataAccessException;

	/**
	 * 根据主键集合删除一组domainObject
	 * 
	 * @param clazz
	 *            对象的类型
	 * @param ids
	 *            主键集合
	 * @throws DataAccessException
	 */
	void delete(Class<? extends DomainObject> clazz, List<Serializable> ids) throws DataAccessException;

	/**
	 * 根据主键id从缓存中获取一个对象
	 * 
	 * @param <T>
	 * @param clazz
	 *            对象类型
	 * @param id
	 *            主键
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> T load(Class<T> clazz, Serializable id) throws DataAccessException;

	/**
	 * 
	 * 根据主键id集合从缓存中获取一组对象
	 * 
	 * @param clazz
	 *            对象类型
	 * @param ids
	 *            id集合
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> List<T> load(Class<T> clazz, List<Serializable> ids) throws DataAccessException;

	/**
	 * 根据主键id从数据库中获取指定id对象
	 * 
	 * @param <T>
	 * @param clazz
	 *            对象类型
	 * @param id
	 *            主键
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> T get(Class<T> clazz, Serializable id) throws DataAccessException;

	/**
	 * 
	 * 根据主键id集合从数据库获取一组domainObject
	 * 
	 * @param clazz
	 * @param ids
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> List<T> get(Class<T> clazz, List<Serializable> ids) throws DataAccessException;

	/**
	 * 查询所有domainObject
	 * 
	 * @param <T>
	 * @param clazz
	 *            对象类型
	 * @param cacheable
	 *            是否加入到缓存
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> List<T> query(Class<T> clazz, boolean cacheable) throws DataAccessException;

	/**
	 * 根据hql语句查询domainObject
	 * 
	 * @param <T>
	 * @param clazz
	 *            对象类型
	 * @param hql
	 *            Hibernate 查询语言
	 * @param parameters
	 *            hql语句参数
	 * @param cacheable
	 *            是否加入到缓存
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> List<T> query(Class<T> clazz, String hql, Map<String, Object> parameters, boolean cacheable) throws DataAccessException;

	/**
	 * 分页查询domainObject
	 * 
	 * @param <T>
	 * @param clazz
	 *            对象类型
	 * @param pageSize
	 *            每页显示的条数
	 * @param firstResult
	 *            第一条的记录数
	 * @param cacheable
	 *            是否加入到缓存
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> List<T> query(Class<T> clazz, int pageSize, int firstResult, boolean cacheable) throws DataAccessException;

	/**
	 * 根据hql语句分页查询domainObject
	 * 
	 * @param <T>
	 * @param hql
	 *            Hibernate 查询语言
	 * @param parameters
	 *            hql语句参数
	 * @param pageSize
	 *            每页显示的条数
	 * @param firstResult
	 *            第一条的记录数
	 * @param cacheable
	 *            是否加入到缓存
	 * @return
	 * @throws DataAccessException
	 */
	<T extends DomainObject> List<T> query(String hql, Map<String, Object> parameters, int pageSize, int firstResult, boolean cacheable) throws DataAccessException;

	/**
	 * 查询domainObject的总记录数
	 * 
	 * @param clazz
	 *            对象类型
	 * @return
	 * @throws DataAccessException
	 */
	int count(Class<? extends DomainObject> clazz) throws DataAccessException;

	/**
	 * 根据hql语句查询domainObject的记录数
	 * 
	 * @param hql
	 *            Hibernate查询语言
	 * @param parameters
	 *            hql语句参数
	 * @return
	 * @throws DataAccessException
	 */
	int count(String hql, Map<String, Object> parameters) throws DataAccessException;

	/**
	 * 
	 * 根据HQL查询domainObject
	 * 
	 * @param hql
	 * @param parameters
	 * @return
	 */
	<T extends DomainObject> List<T> query(Class<T> clazz, String hql, Map<String, Object> parameters);
}
